#ifndef TCPMANAGER_H
#define TCPMANAGER_H

#include <QTcpSocket>
#include <QObject>
#include <QMap>
#include <functional>
#include <memory>

#include "netglobal.h"

// TCP 客户端类 与聊天服务器通信
class TcpManager: public QObject, public std::enable_shared_from_this<TcpManager>
{
    Q_OBJECT //为了可以发送和接收信号
public:
    TcpManager();

private:
    void _SetConnect();
    void _InitHandlers();
    void _SlotTcpManagerModFinish(ReqId id, ErrorCode err, QString res);

public slots:
    // 连接服务器时触发的槽函数
    void slot_tcp_connect(ServerInfo);  
    // 发送数据成功调用的槽函数
    void slot_send_data(ReqId reqId, QString data);

private:
    QTcpSocket _socket;     // 套接字对象
    QString _host;          // 服务器地址
    quint16 _port;          // 服务器端口
    QByteArray _buffer;     // 接收数据缓冲区
    bool _b_recv_pending;   // 接收数据标志
    uint32_t _message_id;    // 消息ID
    uint32_t _message_len;   // 消息长度
    
    QMap<ReqId, std::function<void(ReqId, int32_t, const QByteArray&)>> _handlers; // 消息处理函数映射表
signals:
    // 连接服务器成功或失败信号
    void sig_tcp_connect(bool bsuccess);
    // 发送数据信号
    void sig_send_data(ReqId reqId, QString data);
    // 登录界面切换到聊天窗口
    void sig_switch_chatdlg(); 
    // 登录失败信号
    void sig_login_failed(int);
};

#endif // TCPMANAGER_H
